/*
 * @Author: hebing
 * @Interface: 
 * @Description: 
 * @Date: 2021-04-30 15:53:15
 * @LastEditors: hebing
 * @LastEditTime: 2021-04-30 21:37:03
 * @FilePath: /healthManager-app/store/webSocketStore.js
 */
// import Vue from 'vue'
// import Vuex from 'vuex'

// Vue.use(Vuex)

// export default new Vuex.Store({
// 	state: {
// 		socketTask: null,
// 		eventlist: [],
//         is_open_socket: false
// 	},
// 	mutations: {
// 		WEBSOCKET_INIT(state, url) {
// 			// 创建一个this.socketTask对象【发送、接收、关闭socket都由这个对象操作】
// 			state.socketTask = uni.connectSocket({
// 				url: url,
// 				// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
// 				success(data) {
// 					console.log("websocket连接成功");
// 				},
// 			});

// 			// 消息的发送和接收必须在正常连接打开中,才能发送或接收【否则会失败】
// 			state.socketTask.onOpen((res) => {
// 				console.log("WebSocket连接正常打开中...！");
// 				state.is_open_socket = true;
// 				// 注：只有连接正常打开中 ，才能正常收到消息
// 				state.socketTask.onMessage((res) => {
// 					console.log("收到服务器内容：" + res.data);
// 				});
// 			});
            
//             // 连接关闭监听
//             state.socketTask.onClose((res) => {
//                 console.log("WebSocket连接关闭！");
//             });
//             // 连接错误监听
//             state.socketTask.onError((errMsg) => {
//                 console.log("WebSocket错误：" ,res.data);
//             });
// 		},
// 		WEBSOCKET_SEND(state, p) {
// 			console.log("ws发送！");
// 			state.socketTask.send({
// 				data: p,
// 				async success() {
// 					console.log("消息发送成功");
// 				},
// 			});
// 		},
// 	},


// 	actions: {
// 		WEBSOCKET_INIT({ commit }, url) {
// 			commit('WEBSOCKET_INIT', url)
// 		},
// 		WEBSOCKET_SEND({ commit }, p) {
// 			commit('WEBSOCKET_SEND', p)
// 		}
// 	}
// })
let Socket = ''
let setIntervalWesocketPush = null

/**
 * 建立websocket连接
 * @param {string} url ws地址
 */
export const createSocket = url => {
	Socket && Socket.close()
	if (!Socket) {
		console.log('建立websocket连接')
		Socket = new WebSocket(url)
		Socket.onopen = onopenWS
		Socket.onmessage = onmessageWS
		Socket.onerror = onerrorWS
		Socket.onclose = oncloseWS
	} else {
		console.log('websocket已连接')
	}
}

/**打开WS之后发送心跳 */
const onopenWS = () => {
	sendPing()
}

/**连接失败重连 */
const onerrorWS = () => {
	Socket.close()
	clearInterval(setIntervalWesocketPush)
	console.log('连接失败重连中')
	if (Socket.readyState !== 3) {
		Socket = null
		createSocket()
	}
}

/**WS数据接收统一处理 */
const onmessageWS = e => {
	window.dispatchEvent(new CustomEvent('onmessageWS', {
		detail: {
		data: e.data
		}
	}))
}

/**
 * 发送数据但连接未建立时进行处理等待重发
 * @param {any} message 需要发送的数据
 */
const connecting = message => {
	setTimeout(() => {
		if (Socket.readyState === 0) {
		connecting(message)
		} else {
		Socket.send(JSON.stringify(message))
		}
	}, 1000)
}

/**
 * 发送数据
 * @param {any} message 需要发送的数据
 */
export const sendWSPush = message => {
	if (Socket !== null && Socket.readyState === 3) {
		Socket.close()
		createSocket()
	} else if (Socket.readyState === 1) {
		Socket.send(JSON.stringify(message))
	} else if (Socket.readyState === 0) {
		connecting(message)
	}
}

/**断开重连 */
const oncloseWS = () => {
	clearInterval(setIntervalWesocketPush)
	console.log('websocket已断开....正在尝试重连')
	if (Socket.readyState !== 2) {
		Socket = null
		createSocket()
	}
}
/**发送心跳
 * @param {number} time 心跳间隔毫秒 默认5000
 * @param {string} ping 心跳名称 默认字符串ping
 */
export const sendPing = (time = 60000, ping = 'ping') => {
	clearInterval(setIntervalWesocketPush)
	Socket.send(ping)
	setIntervalWesocketPush = setInterval(() => {
		Socket.send(ping)
	}, time)
}